//package com.sinothk.gpserver.connection.websocket;
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//import org.springframework.stereotype.Service;
//
//import javax.websocket.*;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.concurrent.CopyOnWriteArraySet;
//
///**
// * 编写 Liang Y.T.
// * 时间 2021/6/24 17:25
// *
// * @ ServerEndpoint 注解是一个类层次的注解，它的功能主要是将目前的类定义成一个websocket服务器端,
// * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
// */
//@Component
//@Slf4j
//@Service
//@ServerEndpoint("/socket/{sid}")
//public class WebSocketServerB {
//
//    //静态变量，用来记录当前在线连接数。应该把它设计成线程安全的。
//    private static int onlineCount = 0;
//    //concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。
//    private static CopyOnWriteArraySet<WebSocketServerB> webSocketSet = new CopyOnWriteArraySet<WebSocketServerB>();
//
//    //与某个客户端的连接会话，需要通过它来给客户端发送数据
//    private Session session;
//
//    //接收sid
//    private String sid = "";
//
//    public static synchronized int getOnlineCount() {
//        return onlineCount;
//    }
//
//    public static synchronized void addOnlineCount() {
//        WebSocketServerB.onlineCount++;
//    }
//
//    public static synchronized void subOnlineCount() {
//        WebSocketServerB.onlineCount--;
//    }
//
//    public static CopyOnWriteArraySet<WebSocketServerB> getWebSocketSet() {
//        return webSocketSet;
//    }
//
//    private static WebSocketServerB singObj;
//
//    public static WebSocketServerB obj() {
//        if (null == singObj) {
//            synchronized (WebSocketServerB.class) {
//                if (null == singObj) {
//                    singObj = new WebSocketServerB();
//                }
//            }
//        }
//        return singObj;
//    }
//
//    /**
//     * 连接建立成功调用的方法
//     */
//    @OnOpen
//    public void onOpen(Session session, @PathParam("sid") String sid) {
//        this.session = session;
//        webSocketSet.add(this);     //加入set中
//        this.sid = sid;
//        addOnlineCount();           //在线数加1
//        try {
//            sendMessage("conn_success");
//            log.info("有新窗口开始监听:" + sid + ",当前在线人数为:" + getOnlineCount());
//        } catch (IOException e) {
//            log.error("websocket IO Exception");
//        }
//    }
//
//    /**
//     * 连接关闭调用的方法
//     */
//    @OnClose
//    public void onClose() {
//        webSocketSet.remove(this);  //从set中删除
//        subOnlineCount();           //在线数减1
//        //断开连接情况下，更新主板占用情况为释放
//        log.info("释放的sid为：" + sid);
//        //这里写你 释放的时候，要处理的业务
//        log.info("有一连接关闭！当前在线人数为" + getOnlineCount());
//    }
//
//    /**
//     * @ Param session
//     * @ Param error
//     */
//    @OnError
//    public void onError(Session session, Throwable error) {
//        log.error("发生错误");
//        error.printStackTrace();
//    }
//
//    // 收到消息 ================================================================================================
//
//    /**
//     * 收到客户端消息后调用的方法
//     *
//     * @ Param message 客户端发送过来的消息
//     */
//    @OnMessage
//    public void onMessage(String msg, Session session) {
//        log.info("收到来自窗口" + sid + "的信息:" + msg);
////        //群发消息
////        for (WebSocketServer item : webSocketSet) {
////            try {
////                item.sendMessage(message);
////            } catch (IOException e) {
////                e.printStackTrace();
////            }
////        }
//    }
//
//    // 发送消息 ================================================================================================
//    public void send(Message message) {
//        if (message == null) {
//            log.error("消息信息为空");
//            return;
//        }
//
//        if (message.getType() == 0) {
//            log.error("所有消息");
//        } else if (message.getType() == 1) {
//
//            sendInfo(String targetId, String message);
//
//
//            log.error("个人消息");
//        } else if (message.getType() == 2) {
//            log.error("房间消息");
//        } else if (message.getType() == 3) {
//            log.error("群组消息");
//        } else if (message.getType() == 5) {
//            log.error("俱乐部消息");
//        }
//
//        for (WebSocketServerB item : webSocketSet) {
//            try {
//                //这里可以设定只推送给这个sid的，为null则全部推送
//                if (targetId == null) {
////                    item.sendMessage(message);
//                } else if (item.sid.equals(targetId)) {
////                    item.sendMessage(message);
//
//
//                }
//            } catch (IOException e) {
//                continue;
//            }
//        }
//        this.session.getBasicRemote().sendObject();
//    }
//
//    /**
//     * 实现服务器主动推送
//     */
//    public void sendMessage(String message) throws IOException {
//        this.session.getBasicRemote().sendText(message);
//    }
//    /**
//     * 群发自定义消息 @PathParam("targetId")
//     */
//    public void sendInfo(String targetId, String message) throws IOException {
//        log.info("推送消息到窗口" + targetId + "，推送内容:" + message);
//        for (WebSocketServerB item : webSocketSet) {
//            try {
//                //这里可以设定只推送给这个sid的，为null则全部推送
//                if (targetId == null) {
////                    item.sendMessage(message);
//                } else if (item.sid.equals(targetId)) {
//                    item.sendMessage(message);
//                }
//            } catch (IOException e) {
//                continue;
//            }
//        }
//    }
//}
